//
//  ViewController.swift
//  泛型介绍
//
//  Created by 崔博 on 2017/7/12.
//  Copyright © 2017年 崔博. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    // 让每个元素 + 1 返回新数组
    func increametnArray(xs:[Int]) -> [Int] {
        var resulet: [Int] = []
        for x in xs {
            resulet.append(x + 1)
        }
        return resulet
    }
    // 让每个元素 * 2 返回新数组
    func doubleArray(xs: [Int]) -> [Int] {
        var result: [Int] = []
        for x in xs {
            result.append(x * 2)
        }
        return result
    }
    // 这两个函数有大量相同的代码  把相同的地方玻璃出来 单独写一个更通用的函数 然后接受一个新的函数 来得到新的数组
    func conmputerIntArray(xs: [Int], transform: (Int) -> Int) -> [Int] {
        var result: [Int] = []
        for x in xs {
            result.append(transform(x))
        }
        return result
    }
    
    func doubleArray2 (xs: [Int]) -> [Int] {
        return conmputerIntArray(xs: xs, transform: { (x) -> Int in
            x * 2
        })
    }
    
    
    // 会报错因为你接受的是一个 [BOOL] 而不是[Int] 除非重新定义函数
//    func isEvenArray(xs: [Int]) -> [Bool] {
//        return conmputerIntArray(xs: xs, transform: { (x) -> Int in
//            x % 2 == 0
//        })
//    }
    func genericComputerArray1<T>(xs: [Int], transfor:(Int) -> T) -> [T] {
        var result: [T] = []
        for x in xs {
            result.append(transfor(x))
        }
        return result
    }
    
    func map<Elment,T>(xs: [Elment], transform: (Elment) -> T) -> [T] {
        var result: [T] = []
        for x in xs {
            result.append(transform(x))
        }
        return result
    }
    
//    func genericComputerArray2<T>(xs:[Int], transform: (Int) -> T) -> [T] {
//        return map(xs: xs, transform: { (Elment) -> T in
//            
//        })
//    }
    
}

extension Array{
    
    func map<T>(transform: (Element) -> T) -> [T] {
        var reuslt: [T] = []
        for x in self {
            reuslt.append(transform(x))
        }
        return reuslt
    }
}
